DMMF: 関数合成
1 つ目の関数の出力を 2 つ目の関数の入力に繋げて、
https://scrapbox.io/files/66a3616bd9e9c8001ca52488.png
関数を組み合わせること
https://scrapbox.io/files/66a361752fea76001de17f2b.png
何が嬉しい?
情報(関数が小さな関数から合成されたことや、小さな関数が何を操作していたかなど)の隠蔽ができる
F# における関数の合成
最初の関数の出力の型と、2 番目の関数の入力の型が同じであれば、|> で合成できる
e.g.
code:fsharp
let add1 x = x + 1
let square x = x * x
let add1ThenSquare x =
x |> add1 |> square
add1ThenSquare 5 // 36
https://scrapbox.io/files/66a3657333f3bc001ccd4156.png
e.g.
code:fsharp
let isEven x =
(x % 2) = 0
let printBool x =
sprintf "value is %b" x
let isEvenThenPrint x =
x |> isEven |> printBool
isEvenThenPrint 2
関数からアプリケーション全体を構築する
合成を利用することで、完全なアプリケーションを構築できる
アプリケーションの最下層にある基本的な関数から始める
https://scrapbox.io/files/66a3670d9ddb67001dc17f3c.png
複数の基本的な関数を合成して、サービス 関数を作成できる https://scrapbox.io/files/66a36729a98ee0001df5b7f4.png
複数のサービス関数を合成して、ワークフロー を処理する関数を作成できる https://scrapbox.io/files/66a3677c40ad1a001c4e7b21.png
https://scrapbox.io/files/66a367dcfa9c6a001cfcbf8e.png
各層は、入力と出力を持つ関数で構成される
関数を合成する上での課題
一方の関数の出力がもう一方の関数の入力と合致しない場合どうする?
e.g. int vs Option<int>
https://scrapbox.io/files/66a36a5e1825b4001d394121.png
両方の型を包含する「最小」の型を考える
e.g. int vs Option<int>
function A の出力の型を Option にする
https://scrapbox.io/files/66a36b90fc6669001d0adebc.png
code:fsharp
let add1 x = x + 1
let printOption x =
match x with
| Some i -> printfn "The int is %i" i
| None -> printfn "No value"
5 |> add1 |> Some |> printOption // The int is 6
より複雑な例は以下